package pruebas;

import modelo.*;
import modelo.moviles.exceptions.ArsenalSinArmas;
import modelo.moviles.exceptions.MovilNoEstaEnLaLista;
import modelo.moviles.balas.Bala;
import modelo.moviles.naves.Algo42;
import modelo.moviles.naves.Avioneta;
import modelo.moviles.naves.Bombardero;
import modelo.moviles.naves.Caza;
import modelo.moviles.naves.Explorador;
import modelo.moviles.naves.Nave;
import modelo.moviles.naves.NaveArmada;
import junit.framework.TestCase;

public class TestEstrategiaDeVuelo extends TestCase{


	/* "testea la EstrategiaBalaAlgo42 " */
	public void testEstrategiaBalaAlgo42(){

		Nivel nivel = new Nivel (30 ,30);
		NaveArmada nave = new Algo42(nivel);
		
		Bala bala = null;
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}
		
		
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara"*/
		assertEquals("La bala no sale en la columna correspondiente",bala.getColumna(),nave.getColumna());
		
		/* "la fila inicial de la bala debe ser una mas adelantada que la de la nave que la dispara" */
		assertEquals("La bala no sale en la fila correspondiente",(nave.getFila() - 10),bala.getFila());
	
		bala.vivir();
	
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),nave.getColumna());
		
		/* "la fila inicial de la bala debe ser ahora 20 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() - 20));
		
		/* "Al moverlo otra vez sigue su camino" */
		bala.vivir();
	
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),nave.getColumna());
	
		/* "la fila inicial de la bala debe ser ahora 30 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() - 30));
	
		/*"Al mover otra vez se le termina el nivel y debe estallar"
		"Al estallar sale de la lista de moviles del nivel. Esa lista ahora la debe estar conteniendo. 
		Trato de removerla y compruebo que se puede."*/
		try {
			nivel.removerMovil(bala);
		} catch (MovilNoEstaEnLaLista e){
			fail ("La Estrategia hizo estallar a la bala cuando no debia.");
		}
		/* "Ahora vuelvo a agregarla para seguir con el testeo"*/ 
		nivel.agregarMovil(bala); 	
			
		bala.vivir();
		
		
		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuando debia.",bala.noEstallo());	

	}


	
	/* "testea la EstrategiaEnCirculos " */
	public void testEstrategiaEnCirculos(){
	
		Nivel nivel = new Nivel(100,100);
	
		Nave nave = new Explorador(nivel);
		nave.setPosicion(new Posicion(50,10));
		
		/* "Guardo la fila y columna actual y muevo" */
		int filaAnterior = nave.getFila();
		int columnaAnterior = nave.getColumna();
		
		nave.vivir();	
	
		/* "La EstrategiaEnCirculos consta de 8 pasos, movemos 8 veces para ver los distintos cambios." */
	
		/* "Paso 1: La fila se aumenta 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(),(filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		
		/* "Paso 2: La fila se aumenta 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(),(filaAnterior - 10) );
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		/* "Paso 3: La fila se baja 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(),(filaAnterior + 10 ) );
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 4: La fila se baja 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(),(filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 5: La fila se baja 1 y la columna disminuye 1" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 6: La fila se baja 1 y la columna disminuye 1" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
		
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 7: La fila aumenta 1 y la columna disminuye 1" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 8: La fila aumenta 1 y la columna disminuye 1" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
		
		/* "Cuando termina los 8 pasos vuelve al paso 1". 
		 "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
			
		/* "Paso 9 -> Paso 1: La fila se aumenta 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 10 -> Paso 2: La fila se aumenta 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 20));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		/* "Paso 11 -> Paso 3: La fila se baja 1 y la columna aumenta 2" */
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 20));	
	
		/* "A esta altura salio del Mapa, en el proximo paso debe estallar"
		"Al estallar sale de la lista de moviles del nivel. Esa lista ahora la debe estar conteniendo. Trato de removerla y compruebo que se puede." */
		try {
			nivel.removerMovil(nave);
			
		} catch (MovilNoEstaEnLaLista e){
			fail ("La Estrategia no hizo estallar a la bala cuando debia.");
		}
		
		
		/* "Ahora vuelvo a agregarla para seguir con el testeo" */
		nivel.agregarMovil(nave);
			
		nave.vivir();
		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuando debia.",nave.noEstallo());
	}


	
	/* "testea la EstrategiaEnV  " */
	public void testEstrategiaEnV(){
	
		Nivel nivel = new Nivel (200 ,200);
		Nave nave = new Caza (nivel);
		nave.setPosicion(new Posicion (10 ,10));
	
		/* "Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 1: La fila disminuye 1 y la columna aumenta 1" */
		/* "Guardo la fila y columna actual y muevo" */
		int filaAnterior = nave.getFila();
		int columnaAnterior = nave.getColumna();
		
		nave.vivir();
		
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
		
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 2: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 3: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 4: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 5: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 6: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 7: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 8: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/*"Estamos antes de la mitad del ancho del nivel, debemos bajar."
		"Paso 9: La fila disminuye 1 y la columna aumenta 1"*/
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
	
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 10: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
		
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 11: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
		
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 12: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
		
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 13: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
		
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 14: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 15: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 16: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 17: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 18: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );

		/* "Estamos despues de la mitad del ancho del nivel, debemos subir."
		"Paso 19: La fila aumenta 1 y la columna aumenta 1" */
		assertFalse("La nave no esta en la segunda mitad",nave.getColumna() < (nave.getNivel().getCantColumnas() / 2));
	
		/* "Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(), (columnaAnterior + 10) );
	
	
		/* "A esta altura salio del Mapa, en el proximo paso debe estallar"
		"Al estallar sale de la lista de moviles del nivel. 
		Esa lista ahora la debe estar conteniendo. 
		Trato de removerla y compruebo que se puede." */
		try{
			nivel.removerMovil(nave);
		}catch (MovilNoEstaEnLaLista e){
			System.err.println(e.getDetalle());
		}
	
		/* "Ahora vuelvo a agregarla para seguir con el testeo" */
		nivel.agregarMovil(nave); 	
			

		nave.vivir();
		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuanod debia.",nave.noEstallo());
	}
	
	/* 		"testea la EstrategiaLineaRecta " */
	public void testEstrategiaLineaRecta(){
	
	
		Nivel nivel = new Nivel(30,100);
		NaveArmada nave = new Avioneta(nivel);
		nave.setPosicion(new Posicion(1,40));
	
		Bala bala = null;
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}
		/* "la fila inicial de la bala debe ser una mas adelantada que la de la nave que la dispara"*/
		assertEquals("La bala no sale en la fila correspondiente",bala.getFila(), (nave.getFila() + 10));
	
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("La bala no sale en la columna correspondiente",bala.getColumna() , (nave.getColumna()));
	
		/* "Muevo una vez" */
		bala.vivir();
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("La bala no sale en la columna correspondiente",bala.getColumna() , (nave.getColumna()));
		/* "la fila inicial de la bala debe ser ahora 2 mas adelante que la de la nave que la dispara" */
		assertEquals("La bala no sale en la fila correspondiente",bala.getFila(), (nave.getFila() + 20));
	
		/* "Vuelvo a mover" */
		bala.vivir();
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("La bala no sale en la columna correspondiente",bala.getColumna() , (nave.getColumna()));
		/* "la fila inicial de la bala debe ser ahora 2 mas adelante que la de la nave que la dispara" */
		assertEquals("La bala no sale en la fila correspondiente",bala.getFila(), (nave.getFila() + 30));
	
	
		/* "Al mover una vez mas, como estaba en la fila 0 debe estallar" 
		"Al estallar sale de la lista de moviles del nivel. 
		Esa lista ahora la debe estar conteniendo. 
		Trato de removerla y compruebo que se puede." */
		try{
			nivel.removerMovil(bala);
		}catch (MovilNoEstaEnLaLista e){
			System.err.println(e.getDetalle());
		}
	
		/* "Ahora vuelvo a agregarla para seguir con el testeo" */
		nivel.agregarMovil(bala);
			
		bala.vivir();
		
		
		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuando debia.",bala.noEstallo());
	}
	
	/* "testea la EstrategiaLineaRectaIdaYVuelta " */
	public void testEstrategiaLineaRectaIdaYVuelta(){

		Nivel nivel = new Nivel (31 , 21);

		Nave nave = new Avioneta(nivel);
		nave.setPosicion(new Posicion(1,10));
	
		/* "Paso 1: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		int filaAnterior = nave.getFila();
		int columnaAnterior = nave.getColumna();
	
		nave.vivir();
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 2: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 3: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/*"Paso 4: Llego al piso, cambia de columna. La columna aumenta 1 y la fila no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), filaAnterior);
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 10));
	
		/*"Paso 5: La fila aumenta 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		
		/* "Paso 6: La fila aumenta 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/*"Paso 7: La fila aumenta 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/*"Paso 8: La fila aumenta 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior - 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/*"Paso 9: La fila aumenta 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), filaAnterior );
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior + 10);
	
		/* "Paso 10: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 11: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 12: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();
		
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 13: La fila disminuye 1 y la columna no se mueve"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
		nave.vivir();

		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),columnaAnterior );
	
		/* "Paso 15: Como ya recorrio todo debe estallar." */
		nave.vivir();	
	
		/* "Luego de moverse debio estallar." */ 
		assertFalse("El movil no estallo cuando debia",nave.noEstallo());	
	}
	
	/* "testea la EstrategiaRastreador " */
	public void testEstrategiaRastreador(){
		
		Nivel nivel = new Nivel(60,50);
	
		Algo42 objetivo = new Algo42(nivel);
		objetivo.setPosicion(new Posicion(51,30));
	
		Bombardero nave = new Bombardero(nivel);
		nave.setPosicion(new Posicion(1,10));
		nave.setObjetivo(objetivo);
	
		/* "Primero Disparo los dos cohetes, no me interesa el movimiento." */
		Bala bala = null;
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}

		assertEquals("No es un cohete.",bala.getIntensidad(),100);
		bala.estallar();
		
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}
		
		assertEquals("No es un cohete.",bala.getIntensidad(),100);
		bala.estallar();
		
		/* "Disparo un torpedo rastreador" */
		nave.puedeDisparar();
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}
		
		assertEquals("No es un torpedo rastreador.",bala.getIntensidad(),35);
			
		/* "la columna inicial de la bala debe ser la misma que la de la nave que la dispara" */
		assertEquals("La bala no sale en la columna correspondiente",bala.getColumna(),nave.getColumna());
		/* "la fila inicial de la bala debe ser una mas adelantada que la de la nave que la dispara" */
		assertEquals("La bala no sale en la fila correspondiente",bala.getFila(),(nave.getFila() + 10));
	
		/* "Movemos la primera vez" */
		bala.vivir();
		assertTrue("El movil estallo sin deber",bala.noEstallo());
		
		/* "la columna se mueve hasta conseguir la columna del objetivo" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),(nave.getColumna() + 10 ));
		/* "la fila inicial de la bala debe ser ahora 2 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() + 20));
	
		/* "Movemos la segunda vez" */
		bala.vivir();
		/* "la columna se mueve hasta conseguir la columna del objetivo" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),(nave.getColumna() + 20 ));
		/* "la fila inicial de la bala debe ser ahora 3 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() + 30));

	
		/* "Movemos la tercera vez" */
		bala.vivir();
		/* "la columna no se mueve porque ya esta en la columna del objetivo" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),objetivo.getColumna());
		/* "la fila inicial de la bala debe ser ahora 4 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() + 40));
		
		/* "Movemos la cuarta vez" */
		bala.vivir();
		/* "la columna no se mueve porque ya esta en la columna del objetivo" */
		assertEquals("El movil falla al adelantar la columna",bala.getColumna(),objetivo.getColumna());
		/* "la fila inicial de la bala debe ser ahora 5 mas adelante que la de la nave que la dispara" */
		assertEquals("El movil falla al adelantar la fila",bala.getFila(),(nave.getFila() + 50));
	
		assertTrue("La Bala no encuentra el objetivo",bala.getPosicion().mismaPosicion(objetivo.getPosicion(), bala.getFactorMovimiento()));

		bala.estallar();
		
		/* "Disparo un torpedo rastreador" */
		nave.puedeDisparar();
		try{
			bala = nave.disparar();
		} catch (ArsenalSinArmas e){
			fail(e.getDetalle());
		}
		assertEquals("No es un torpedo rastreador.",bala.getIntensidad(),35);
	
		/* "Muevo 5 veces la bala" */
		bala.vivir();
		bala.vivir();
		bala.vivir();
		bala.vivir();
		bala.vivir();

		/* "Al mover una vez mas, como llego al final debe estallar"
		"Al estallar sale de la lista de moviles del nivel. Esa lista ahora la debe estar conteniendo. 
		Trato de removerla y compruebo que se puede." */
		try{
			nivel.removerMovil(bala);
		}catch (MovilNoEstaEnLaLista e){
			fail(e.getDetalle());
		}
	
		/* "Ahora vuelvo a agregarla para seguir con el testeo" */
		nivel.agregarMovil(bala); 	
		
		bala.vivir();
		

		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuando debia.",bala.noEstallo());
	}	
	
	/* "testea la EstrategiaZigZag " */
	public void testEstrategiaZigZag(){
		   
		Nivel nivel = new Nivel(120 ,70);
		Nave nave = new Bombardero(nivel);
		nave.setPosicion(new Posicion(20,20));
	
		/* "Paso 1: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		int filaAnterior = nave.getFila();
		int columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10 ));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior  + 10));
	
	
		/* "Paso 2: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior  + 10));
	
		
		/* "Paso 3: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior  + 10));
	

		/* "Paso 4: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior  + 10));
	
	
			
		/*"Paso 5: La fila disminuye 1 y la columna disminuye 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	

	
		/*"Paso 6: La fila disminuye 1 y la columna disminuye 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	

			
		/* "Paso 7: La fila disminuye 1 y la columna disminuye 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	

		/*"Paso 8: La fila disminuye 1 y la columna disminuye 1"
				"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior - 10));
	

	
		/*"Paso 9 -> Paso 1: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 10));
	

		/*"Paso 10 -> Paso 2: La fila disminuye 1 y la columna aumenta 1"
		"Guardo la fila y columna actual y muevo" */
		filaAnterior = nave.getFila();
		columnaAnterior = nave.getColumna();
	
		nave.vivir();
	
		assertTrue("El movil estallo sin deber",nave.noEstallo());
		assertEquals("La estrategia no mueve bien la fila",nave.getFila(), (filaAnterior + 10));
		assertEquals("La estrategia no mueve bien la columna",nave.getColumna(),(columnaAnterior + 10));
	
	
		/* "Paso 11: Como ya llego al final debe estallar" */
		assertTrue("La nave estallo antes de tiempo",nave.noEstallo());
	
		
		/* "Al mover una vez mas, como llego al final debe estallar"
		"Al estallar sale de la lista de moviles del nivel. Esa lista ahora la debe estar conteniendo. 
		Trato de removerla y compruebo que se puede." */
		try{
			nivel.removerMovil(nave);
		}catch (MovilNoEstaEnLaLista e){
			fail(e.getDetalle());
		}
	
		/* "Ahora vuelvo a agregarla para seguir con el testeo" */
		nivel.agregarMovil(nave); 	
		
		nave.vivir();
		
	
		/* "Luego de moverse debio estallar." */
		assertFalse("El movil no estallo cuando debia.",nave.noEstallo());
		
	}	
}


